#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#include <set>
using namespace std;
using ll = long long;
using T = int;
T rad(); // quick read
const int inf = 0x3f3f3f3f;
#define rf(i, n) for (int i = 1; i <= (n); ++i)
const int max_size = 5 + 100;
const int maxn = 5 + 100;

struct Node {
    int x, y;
    bool operator<(const Node &r) const { return (ll)x * y < (ll)r.x * r.y; }
};

priority_queue<Node> qe;
set<pair<int, int>> s;

void insert(int x, int y) {
    if (s.find({x, y}) != s.end()) return;
    qe.push({x, y}), s.insert({x, y});
}

int main() {
    int n = rad(), m = rad(), k = rad();
    insert(n, m);
    for (int i = 1; i < k; ++i) {
        int x = qe.top().x, y = qe.top().y;
        // printf("%d %d\n", x, y);
        qe.pop(), s.erase(s.find({x, y}));
        insert(x - 1, y), insert(x, y - 1);
    }
    printf("%lld", qe.top().x * (ll)qe.top().y);
}

T rad() {
    T back = 0;
    int ch = 0, posi = 0;
    for (; ch < '0' || ch > '9'; ch = getchar())
        posi = ch ^ '-';
    for (; ch >= '0' && ch <= '9'; ch = getchar())
        back = (back << 1) + (back << 3) + (ch & 0xf);
    return posi ? back : -back;
}